#ifndef CPPOBJECT_H
#define CPPOBJECT_H

#include <QObject>

//派生自QObject
//使用qmlRegisterType注册到QML中
class CppObject : public QObject
{
    Q_OBJECT
    //注册属性，使之可以在QML中访问--具体语法百度Q_PROPERTY
    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(int year READ getYear WRITE setYear NOTIFY yearChanged)

    /* Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged):
     * 这一行代码用于声明一个名为name的属性，它的类型是QString。
     * READ, WRITE和NOTIFY分别指定了读取、写入和属性变化时的信号。
     * 这表示对于name属性，您可以使用getName函数来读取属性的值，使用setName函数来设置属性的值，
     * 而nameChanged信号在属性值变化时将被发射。*/

public:
    explicit CppObject(QObject *parent = nullptr);
    //通过Q_INVOKABLE宏标记的public函数可以在QML中访问
    Q_INVOKABLE void sendSignal();//功能为发送信号  cpp->QML

    // 给类属性添加访问方法--myName
    void setName(const QString &name);
    QString getName() const;
    // 给类属性添加访问方法--myYear
    void setYear(int year);
    int getYear() const;

signals:
    // 信号可以在QML中访问
    void cppSignalA();//一个无参信号  QML->CPP
    void cppSignalB(const QString &str,int value);//一个带参数信号 QML->CPP

    void nameChanged(const QString &name);
    void yearChanged(int year);

public slots:
    // public槽函数可以在QML中访问
    void cppSlotA();//一个无参槽函数
    void cppSlotB(const QString &str,int value);//一个带参数槽函数

    // 姓名改变保存到文件
    void nameChangedSlot(const QString &name);


private:
    // 类的属性
    QString myName;
    int myYear;
};

#endif // CPPOBJECT_H
